/**
 * 为什么整型变量的大小不固定？
 * 简而言之，这可以追溯到 C 语言，当时计算机速度很慢，性能是最受关注的。C 选择故意保留整数的大小，
 * 以便编译器实现者可以选择在目标计算机体系结构上表现最佳的 int 大小。
 * 
 * 这不是很糟糕吗？
 * 按照现代标准，是的。作为一名程序员，必须处理具有不确定范围的类型有点荒谬。
 * 考虑 int 类型。int 的最小大小为 2 个字节，但在现代体系结构中通常为 4 个字节。
 * 如果您假设 int 是 4 字节（因为这很可能），那么您的程序可能会在 int 实际上是 2 字节的体系结构上出现错误（因为您可能会在 2 字节变量中存储需要 4 字节的值，这将导致溢出或未定义的行为）。
 * 如果您假设 int 只有 2 个字节以确保最大兼容性，那么在 int 为 4 字节的系统上，您将浪费每个整数 2 个字节，并使内存使用量增加一倍！
 * 
 * 为了解决上述问题，C99 定义了一组固定宽度整数（在 stdint.h 标头中），保证在任何体系结构上具有相同的大小。
 * 
 * std::int8_t	    1 字节有符号	-128 至 127	在许多系统上被视为签名字符。请参阅下面的注释。
 * std::uint8_t	    1 字节无符号	0 至 255	在许多系统上被视为无符号字符。请参阅下面的注释。
 * std::int16_t	    2 字节有符号	-32,768 至 32,767	
 * std::uint16_t	2 字节无符号	0 至 65,535	
 * std::int32_t	    4 字节有符号	-2,147,483,648 至 2,147,483,647	
 * std::uint32_t	4 字节无符号	0 至 4,294,967,295	
 * std::int64_t	    8 字节有符号	-9,223,372,036,854,775,808 至 9,223,372,036,854,775,807	
 * std::uint64_t	8 字节无符号	0 至 18,446,744,073,709,551,615
 * 
 * C++ 正式采用这些固定宽度整数作为 C++11 的一部分。可以通过包含标头来访问它们，它们在std<cstdint>命名空间内定义。
 * 
 * 快速和最小整数
 * 
 * 最佳实践
 *   一般情况下能用int就用int
 * 
 */

#include <cstdint> // for fixed-width integers
#include <iostream>

int main()
{
    std::int16_t i{5};
    std::cout << i << '\n';


    // 快速和最小整数
    std::cout << "least 8:  " << sizeof(std::int_least8_t) * 8 << " bits\n";
	std::cout << "least 16: " << sizeof(std::int_least16_t) * 8 << " bits\n";
	std::cout << "least 32: " << sizeof(std::int_least32_t) * 8 << " bits\n";
	std::cout << '\n';
	std::cout << "fast 8:  " << sizeof(std::int_fast8_t) * 8 << " bits\n";
	std::cout << "fast 16: " << sizeof(std::int_fast16_t) * 8 << " bits\n";
	std::cout << "fast 32: " << sizeof(std::int_fast32_t) * 8 << " bits\n";


    std::uint_fast16_t sometype { 0 };
    --sometype; // intentionally overflow to invoke wraparound behavior

    std::cout << sometype << '\n';

    return 0;
}

